/**
 * 
 */
package fr.gfi.agraf.vue.action.administrer.utilisateur;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;

import fr.gfi.agraf.exception.AgrafException;
import fr.gfi.agraf.utils.PropertiesUtils;
import fr.gfi.agraf.utils.VerificationUtils;
import fr.gfi.agraf.vue.action.gerer.modifiercompte.ModifierCompteAction;
import fr.gfi.agraf.vue.action.login.LoginAction;
import fr.gfi.agraf.vue.action.login.ReinitMdpAction;
import fr.gfi.agraf.vue.bean.UtilisateurDTO;

/**
 * @author Zakaria
 * 
 */
public class ModifierUtilisateurAction extends
		AbstractTraitementUtilisateurAction {

	/**
	 * Logger
	 */
	private final static Logger LOGGER = Logger
			.getLogger(ModifierUtilisateurAction.class);

	/**
	 * 
	 */
	private static final long serialVersionUID = 8004589231698423892L;

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * fr.gfi.agraf.vue.action.AbstractApplicationSupportAction#executeAction()
	 */
	@Override
	public String executeAction() throws Exception {

		if (validateForm()) {

			// créé utilisateurDTO
			final UtilisateurDTO utilisateurDTO = creerUtilisateurDTO();
			UtilisateurDTO newUtilisateurDTO = null;
			try {
				// appel au service
				newUtilisateurDTO = utilisateurService.modifierUtilisateur(
						utilisateurDTO, true);
			} catch (final AgrafException ae) {
				// Recupére le message d'erreur
				final String messageErreur = PropertiesUtils.getProperty(ae
						.getKey());
				// Ajoute action error
				addActionError(messageErreur);
				LOGGER.error(messageErreur, ae);
				return ERROR;
			}
			// si l'utilisateur modifié est le même que celui connecté
			if (getUtilisateurConnecte().getId() == newUtilisateurDTO.getId()) {
				// met à jour l'utilisateur en session
				sessionMap.put(LoginAction.UTILISATEUR, newUtilisateurDTO);
			}
			return SUCCESS;
		}else{
			return ERROR;
		}
	}

	public boolean validateForm() {
		if (id == null || id == 0) {
			addActionError(ModifierCompteAction.ERREUR_SAISIE_ID);
			return false;
		}

		if (StringUtils.isBlank(oldLogin)) {
			addActionError(ERREUR_SAISIE_HIDDEN);
			return false;
		}

		return validateMail() && validatePassword();
	}

	/**
	 * Valider le password
	 * 
	 */
	private boolean validatePassword() {
		if ((StringUtils.isNotBlank(newPassword) || StringUtils
				.isNotBlank(newPassword2))
				&& !StringUtils.equals(newPassword, newPassword2)) {
			addActionError(ModifierCompteAction.ERREUR_SAISIE_PASSWORD_CONFIRME);
			return false;
		}

		if (StringUtils.isNotBlank(newPassword) && newPassword.length() < 6) {
			addActionError(ModifierCompteAction.ERREUR_SAISIE_PASSWORD_TAILLE);
			return false;
		}

		// Si tout va bien, renvoi true

		return true;
	}

	/**
	 * Verifie informations concernant les mails
	 * 
	 */
	private boolean validateMail() {
		if (StringUtils.isBlank(oldEmail)) {
			addActionError(PropertiesUtils.getProperty(ERREUR_SAISIE_HIDDEN));
			return false;
		}
		if (!VerificationUtils.isEmailValide(email)) {
			addActionError(PropertiesUtils.getProperty(ReinitMdpAction.ERREUR_EMAIL_INVALIDE));
			return false;
		}

		return true;
	}

}
